package org.jsola.hr.service;

import org.jsola.core.Page;
import org.jsola.core.service.IService;
import org.jsola.hr.dao.IEmpEducationDAO;
import org.jsola.hr.dto.EmpEducationAddDTO;
import org.jsola.hr.dto.EmpEducationDTO;
import org.jsola.hr.dto.EmpEducationUpdateDTO;
import org.jsola.hr.entity.EmpEducationDO;
import org.jsola.hr.query.EmpEducationQuery;
import org.jsola.hr.vo.EmpEducationListVO;
import org.jsola.hr.vo.EmpEducationMapVO;
import org.jsola.hr.vo.EmpEducationVO;
import org.jsola.user.core.TokenUser;

import javax.validation.constraints.NotNull;
import java.util.List;
import java.util.Map;


/**
 * @author zhr
 */
public interface IEmpEducationService extends IService<IEmpEducationDAO, EmpEducationDO> {

    /**
     * 新增员工教育经历
     * @param empEducationAddDTO 新增员工教育经历DTO
     * @param tokenUser 当前用户
     * @return 员工教育经历详情信息
     */
    EmpEducationVO save(EmpEducationAddDTO empEducationAddDTO, TokenUser tokenUser);

    /**
     * 修改员工教育经历
     * @param empEducationUpdateDTO 修改员工教育经历DTO
     * @param tokenUser 当前用户
     * @return 更新数量
     */
    int update(EmpEducationUpdateDTO empEducationUpdateDTO, TokenUser tokenUser);


    /**
     * 批量删除员工教育经历，物理删除，更新is_valid字段，从回收站删除
     * @param tokenUser 当前用户
     * @param empEducationIds 员工教育经历id
     * @return 删除数量
     */
    int deleteByIds(TokenUser tokenUser, String...empEducationIds);

    /**
     * 根据员工教育经历id查找
     * @param empEducationId 员工教育经历id
     * @param siteId 所属站点id
     * @return 员工教育经历详情信息
     */
    EmpEducationVO selectById(String empEducationId, String siteId);

    /**
     * 查询员工教育经历
     * @param empEducationQuery 查询条件
     * @param siteId 所属站点id
     * @return 员工教育经历列表信息
     */
    List<EmpEducationListVO> select(EmpEducationQuery empEducationQuery, String siteId);

    /**
    * 查询员工教育经历记录数
    * @param empEducationQuery 查询条件
    * @param siteId 所属站点id
    * @return 员工教育经历记录数
    */
    int selectCount(EmpEducationQuery empEducationQuery, String siteId);

    /**
     * 分页查询员工教育经历
     * @param empEducationQuery 查询条件
     * @param siteId 所属站点id
     * @return 员工教育经历列表信息
     */
    Page<EmpEducationListVO> selectPage(EmpEducationQuery empEducationQuery, String siteId);


    /**
     * 根据员工教育经历id查找
     * @param empEducationId 员工教育经历id
     * @param siteId 所属站点id
     * @return 员工教育经历
     */
    EmpEducationDO selectDOById(String empEducationId, String siteId);

    /**
     * 查询员工教育经历
     * @param empEducationQuery 查询条件
     * @param siteId 所属站点id
     * @return 员工教育经历列表
     */
    List<EmpEducationDO> selectDO(EmpEducationQuery empEducationQuery, String siteId);

    /**
     * 删除员工教育经历
     * @param tokenUser 当前用户
     * @param empEducationId 员工教育经历id
     * @return 删除数量
     */
    Integer deleteEmpEducation(TokenUser tokenUser, String empEducationId);

    /**
     * 根据公司id删除部门
     *
     * @param companyId 公司id
     * @param tokenUser 当前用户
     */
    void deleteByCompanyId(@NotNull String companyId, TokenUser tokenUser);

    /**
     * 教育经历
     *
     * @param empEducationList 教育经历
     * @param companyId        公司id
     * @param empId            人员id
     * @param tokenUser        当前用户
     */
    void publishEmpEducationList(List<EmpEducationDTO> empEducationList, String companyId, String empId, TokenUser tokenUser);

    /**
     * 查找某员工的所有教育经历
     *
     * @param empId  员工id
     * @param siteId 站点
     * @return 员工的所有教育经历
     */
    List<EmpEducationDO> listByEmpId(String empId, String siteId);

    /**
     * 查找某员工的最高学历,最高学位,毕业院校，毕业专业，学习形式
     *
     * @param empId  员工id
     * @return 员工的所有教育经历
     */
    Map<String,String> selectHighestEducationAndDegree(String empId);

    /**
     * 批量查找某员工的最高学历,最高学位,毕业院校，毕业专业，学习形式(多线程，顺序随机)
     *
     * @param empIdList 员工id集合
     * @return 员工的所有教育经历
     */
    List<EmpEducationMapVO> listHighestEducationAndDegree(List<String> empIdList);
}


